package generator

import (
	"fmt"
	"strings"
	"text/template"

	"redisopgen/parser"
)

// Generator 代码生成器
type Generator struct {
	templates map[string]*template.Template
}

// NewGenerator 创建新的生成器
func NewGenerator() *Generator {
	g := &Generator{
		templates: make(map[string]*template.Template),
	}

	// 初始化模板
	g.initTemplates()
	return g
}

// initTemplates 初始化所有模板
func (g *Generator) initTemplates() {
	// Hash类型模板
	g.templates["hash"] = template.Must(template.New("hash").Parse(hashTemplate))
	g.templates["hash_with_suffix"] = template.Must(template.New("hash").Parse(hashTemplateWithSuffix))

	// Set类型模板
	g.templates["set"] = template.Must(template.New("set").Parse(setTemplate))
	g.templates["set_with_suffix"] = template.Must(template.New("set").Parse(setTemplateWithSuffix))

	// Map类型模板
	g.templates["map"] = template.Must(template.New("map").Parse(mapTemplate))
	g.templates["map_with_suffix"] = template.Must(template.New("map").Parse(mapTemplateWithSuffix))
}

// Generate 生成代码
func (g *Generator) Generate(s parser.RedisStruct, protoFileName string) (string, error) {
	template_key := s.Type
	if s.KeyType != "" {
		template_key = s.Type + "_with_suffix"
	}
	tmpl, ok := g.templates[template_key]
	if !ok {
		return "", fmt.Errorf("不支持的Redis类型: %s %s 未找到模板", s.Name, s.Type)
	}

	// 准备模板数据
	data := struct {
		Struct     parser.RedisStruct
		Package    string
		BufferSize string
		ImportPath string
	}{
		Struct:     s,
		Package:    "redisop",
		BufferSize: fmt.Sprintf("%d", s.BufferSize),
		ImportPath: "",
	}
	if data.BufferSize == "0" {
		data.BufferSize = "DefaultProtoBufferSize" // 默认缓冲区大小
	}
	if protoFileName == "cl" {
		data.ImportPath = "app/protos/out/cl"
	} else {
		data.ImportPath = "app/protos/in/" + protoFileName
	}

	// 执行模板
	var buf strings.Builder
	if err := tmpl.Execute(&buf, data); err != nil {
		return "", fmt.Errorf("执行模板失败: %v", err)
	}

	return buf.String(), nil
}
